本文摘要自 20 Common Solidity Beginner Mistakes。
2024/10/12 Solidity v0.8.26 (隨著科技進步,有些坑會被填起來,有新的坑會出現。)slither 可以簡單幫你分析合約的安全漏洞: https://github.com/crytic/slither
(公司產品建議找專業 Audit 團隊審核)
Install slither-analyzer:
python3 -m pip install slither-analyzer
Usage:
slither src/Counter.sol
interest = principal / 3_333 * 10_000
interest = principal * 10_000 / 3_333。transfer 或 send,用 call。
transfer 會對接收者可能執行的邏輯進行 gas 限制,為了避免 reentrancy attack,但這可能也會導致某些正當邏輯無法被執行。tx.origin,用 msg.sender
wallet -> malicious intermediate contract -> final contract: tx.origin 會指向 wallet,導致惡意人士能夠使用中介合約來互動。using SafeERC20 for IERC20 來避開不同 ERC20 代幣實作的錯誤回傳。setProtocolFee: 對於 owner 可設定的費用設置一個合理的上限。pragma solidity ^0.8.0 是給 library 用的。pragma solidity 0.8.26 application 請指定特定版本部署。indexed
100/3 得 33 儘管正確答案是 33.3333。
forge fmt 或 solfmt
_msgSender() 僅用於 Meta Transactions 的情境,不然的話用 msg.sender 就好deposit 內寫 balance[msg.sender] = msg.value; 會複寫每次投入合約的錢,要用 balance[msg.sender] += msg.value。